{\rtf1\mac\ansicpg10000\cocoartf824\cocoasubrtf330
{\fonttbl\f0\fnil\fcharset77 LucidaGrande-Bold;\f1\fnil\fcharset77 LucidaGrande;}
{\colortbl;\red255\green255\blue255;}
{\*\listtable{\list\listtemplateid1\listhybrid{\listlevel\levelnfc0\levelnfcn0\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{decimal\}.}{\leveltext\leveltemplateid0\'02\'05.;}{\levelnumbers\'01;}}{\listname ;}\listid1}
{\list\listtemplateid2\listhybrid{\listlevel\levelnfc0\levelnfcn0\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{decimal\}.}{\leveltext\leveltemplateid0\'02\'05.;}{\levelnumbers\'01;}}{\listname ;}\listid2}
{\list\listtemplateid3\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{hyphen\}}{\leveltext\leveltemplateid0\'02\'05.;}{\levelnumbers\'01;}}{\listname ;}\listid3}
{\list\listtemplateid4\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{hyphen\}}{\leveltext\leveltemplateid0\'02\'05.;}{\levelnumbers\'01;}}{\listname ;}\listid4}
{\list\listtemplateid5\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{hyphen\}}{\leveltext\leveltemplateid0\'02\'05.;}{\levelnumbers\'01;}}{\listname ;}\listid5}
{\list\listtemplateid6\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{hyphen\}}{\leveltext\leveltemplateid0\'02\'05.;}{\levelnumbers\'01;}}{\listname ;}\listid6}}
{\*\listoverridetable{\listoverride\listid1\listoverridecount0\ls1}{\listoverride\listid2\listoverridecount0\ls2}{\listoverride\listid3\listoverridecount0\ls3}{\listoverride\listid4\listoverridecount0\ls4}{\listoverride\listid5\listoverridecount0\ls5}{\listoverride\listid6\listoverridecount0\ls6}}
\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural

\f0\b\fs24 \cf0 About the Audio Reflector Driver
\f1\b0 \
This project builds a kernel-based audio driver that:\
- builds for both Intel and PowerPC\
- reflects data going out one channel back to the corresponding input channel\
- has a completely configurable list of supported formats and stream layouts via it's Info.plist\
- provides a dummy control for just about every standard kind control supported by the IOAudio family\
- demonstrates how to localize strings\
- includes a configurable time stamp generator to allow the simulation of various timing situations\
- includes an integer-to-floating-point and floating-point-to-integer blitting library optimized for SSE3 on Intel processors and Altivec on PowerPC processors\
\

\f0\b Using the Audio Reflector Driver
\f1\b0 \
The simple way:\
\pard\tx220\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\li720\fi-720\ql\qnatural\pardirnatural
\ls1\ilvl0\cf0 {\listtext	1.	}Open the project in Xcode 2.1 or later.\
{\listtext	2.	}Set the build configuration to "Release" and build the project.\
{\listtext	3.	}Set the ownership of all the files in the resulting kext to root:wheel.\
{\listtext	4.	}Move the kext into /System/Library/Extensions.\
{\listtext	5.	}Reboot.\
\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural
\cf0 \
The more complicated, but more flexible way:\
\pard\tx220\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\li720\fi-720\ql\qnatural\pardirnatural
\ls2\ilvl0\cf0 {\listtext	1.	}Open the project in Xcode 2.1 or later.\
{\listtext	2.	}In the file AREngine.cpp, search for "../../../Path/To/Your/BuildProducts/AudioReflectorDriver.kext" and replace it with the path to the built kext. Note that this path is relative to /System/Library/Extensions which is why it starts with "../../../".\
{\listtext	3.	}Set the build configuration to "Debug".\
{\listtext	4.	}Build the project.\
{\listtext	5.	}Set the ownership of all the files in the resulting kext to root:wheel.\
{\listtext	6.	}Load the kext from the command line with the kextload command. Note that kextload has to be run as root.\
{\listtext	7.	}When done, unload the kext from the command line with the kextunload command. Note that kextunload has to be run as root.\
\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural
\cf0 \

\f0\b Configuring the Audio Reflector Driver
\f1\b0 \
The Audio Reflector driver can be configured to have as many streams and support as many formats as desired. The only constraints are that each output stream has to have a corresponding input stream such that the two always have the same sample format.\
\
The configuration is controlled by the "AudioEngine" dictionary in the kext's Info.plist. This dictionary has the following keys:\
Description\
\pard\tx220\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\li720\fi-720\ql\qnatural\pardirnatural
\ls3\ilvl0\cf0 {\listtext	\uc0\u8259 	}value is the name of the engine that the user sees\
\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural
\cf0 NumStreams\
\pard\tx220\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\li720\fi-720\ql\qnatural\pardirnatural
\ls4\ilvl0\cf0 {\listtext	\uc0\u8259 	}value is the number of pairs of input and output streams the engine has\
\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural
\cf0 SampleRates\
\pard\tx220\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\li720\fi-720\ql\qnatural\pardirnatural
\ls5\ilvl0\cf0 {\listtext	\uc0\u8259 	}value is an array of integer sample rates the engine is to support\
{\listtext	\uc0\u8259 	}first item in the array is the default sample rate\
\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural
\cf0 Formats\
\pard\tx220\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\li720\fi-720\ql\qnatural\pardirnatural
\ls6\ilvl0\cf0 {\listtext	\uc0\u8259 	}value is an array of IOAudio format dictionaries that describe each sample format supported by each stream\
{\listtext	\uc0\u8259 	}all streams will support all the formats listed\
{\listtext	\uc0\u8259 	}last item in this array is the default sample format\
{\listtext	\uc0\u8259 	}all high aligned, signed integer linear PCM formats are supported except for 8 bit\
{\listtext	\uc0\u8259 	}only native endian 32 bit floating point samples are supported\
{\listtext	\uc0\u8259 	}all properly described non-mixable formats are supported\
\
\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural
\cf0 The Audio Reflector driver also has a configurable time stamp generator. The implementation can be found in the files ARTimeStampGenerator.h and ARTimeStampGenerator.cpp. The time stamp generator is instantiated and configured in the initHardware method of AREngine. The time stamp generator can have the rate scalar set to a number between 0 and 16 as a 4.28 fixed-point number. The maximum amount of jitter can also be set.\
\
Note that when building the Audio Reflector driver, you can only target Mac OS X 10.3 or later. To do so, first make sure that GCC 3.3 is the default compiler. Then you simply select the appropriate SDK from the "General" tab in the project info window and follow it with a clean build.\
\
The included library of PCM blitter functions has to be compiled with -O3. Compiling with any other optimization setting can result in slow execution, improper results and crashes.\
}